package com.xk857.article.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xk857.article.req.ArticleListREQ;
import com.xk857.article.req.ArticleREQ;
import com.xk857.article.req.ArticleUserREQ;
import com.xk857.entities.Article;
import com.xk857.feign.req.UserInfoREQ;
import com.xk857.util.base.Result;
import com.xk857.util.enums.ArticleStatusEnum;

import java.util.Map;

/**
 * 文章信息表 服务类
 *
 * @author CV大魔王
 * @since 2021-02-21
 */
public interface IArticleService extends IService<Article> {

    /**
     * 分页查询文章信息
     *
     * @param req 条件查询与分页
     * @return
     */
    IPage<Article> queryPage(ArticleREQ req);

    /**
     * 根据文章id查询文章详情与知识点
     *
     * @param id 文章id
     * @return 文章信息
     */
    Article findArticleAndLabelById(String id);

    /**
     * 修改或新增
     *
     * @param article 文章信息
     * @return 文章id
     */
    String updateOrSave(Article article);


    /**
     * 修改文章状态：0: 已删除, 1:未审核，2:审核通过，3：审核未通过，
     * 参考 ArticleStatusEnum
     *
     * @param id         文章id
     * @param statusEnum 文章状态 ArticleStatusEnum
     * @return
     */
    void updateStatus(String id, ArticleStatusEnum statusEnum);


    /**
     * 根据用户ID查询公开或未公开的文章列表
     *
     * @param req 包含 userId 和 isPublic
     * @return 分页后的文章
     */
    IPage<Article> findListByUserId(ArticleUserREQ req);


    /**
     * 更新点赞数
     *
     * @param id
     * @param count
     * @return
     */
    Result updateThumhup(String id, int count);


    /**
     * 更新浏览次数
     *
     * @param id 文章id
     * @return 结果信息
     */
    Result updateViewCount(String id);


    /**
     * 公开且审核通过的文章列表
     *
     * @param req 分类id 或 标签id，分页
     * @return
     */
    IPage<Article> findListByLabelIdOrCategoryId(ArticleListREQ req);


    /**
     * 查询文章总记录数
     * @return 文章总记录数
     */
    Integer getArticleTotal();


    /**
     * 统计每个分类下的文章数
     * @return 每个分类下的文章数
     */
    Map<String, Object> selectCategoryTotal();

    /**
     * 统计近6个月分别发布的文章数
     * @return
     */
    Map<String, Object> selectMonthArticleTotal();


    /**
     * 更新文章与评论表中的用户信息
     * @param req
     * @return
     */
    boolean updateUserInfo(UserInfoREQ req);

    /**
     * 查询今日文章数量
     * @return 文章数量
     */
    Integer searchCountDayNum();

    /**
     * 查询昨日文章数量
     * @return 文章数量
     */
    Integer searchNumberOfArticlesInYesterdaySDay();

    /**
     * 查询近七天文章数量
     * @return 文章数量
     */
    Integer searchNumberOfArticlesInWeek();
}
